#define  _CRT_SECURE_NO_WARNINGS 1
#include <algorithm>
#include <iostream>
#include <vector>
#include <limits.h>
using namespace std;

void MergeArray(vector<int>& v, int begin1, int end1, int begin2, int end2, int* tmp)
{
	int left = begin1;
	int right = end2;
	int index = begin1;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (v[begin1] < v[begin2])
			tmp[index++] = v[begin1++];
		else
			tmp[index++] = v[begin2++];
	}
	while (begin1 <= end1) tmp[index++] = v[begin1++];
	while (begin2 <= end2) tmp[index++] = v[begin2++];
	for (int i = left; i <= right; ++i) v[i] = tmp[i];
}

void _MergeSort(vector<int>& v, int left, int right, int* tmp)
{
	if (left >= right)
		return;
	int div = left + (right - left) / 2;
	_MergeSort(v, left, div, tmp);
	_MergeSort(v, div + 1, right, tmp);
	MergeArray(v, left, div, div + 1, right, tmp);
}

void MergeSort(vector<int>& v, int n)
{
	int* tmp = new int[n];
	_MergeSort(v, 0, n - 1, tmp);
	delete[] tmp;
}

void CountSort(vector<int>& v, int n)
{
	int maxValue = INT_MIN;
	int minValue = INT_MAX;
	for (const auto e : v)
	{
		if (e < minValue) minValue = e;
		if (e > maxValue) maxValue = e;
	}
	vector<int> count(maxValue - minValue + 1);
	for (const auto e : v)
		count[e - minValue]++;
	int index = 0;
	for (int i = 0; i < maxValue - minValue + 1; ++i)
	{
		while (count[i]--)
		{
			v[index++] = i + minValue;
		}
	}

}

int main()
{
	int n = 0;
	cin >> n;
	vector<int> v(n);
	for (auto& e : v)
		cin >> e;

	//MergeSort(v, n);
	CountSort(v, n);

	for (int i = 0; i < n; ++i)
	{
		if (i != n - 1)
			cout << v[i] << ' ';
		else
			cout << v[i] << endl;
	}
	return 0;
}